/**
 * 类型定义文件
 */

import { Map as OlMap } from 'ol';
import { Layer as OlLayer } from 'ol/layer';
import { Feature } from 'ol';
import { Geometry } from 'ol/geom';

/**
 * 数据源类型
 */
export enum DataSourceType {
  /** GeoJSON */
  GEOJSON = 'geojson',
  /** Shapefile */
  SHAPEFILE = 'shapefile',
  /** CSV */
  CSV = 'csv',
  /** 数据库 */
  DATABASE = 'database',
  /** API */
  API = 'api',
  /** 地址文本 */
  ADDRESS = 'address'
}

/**
 * 数据加载进度
 */
export interface LoadProgress {
  /** 已加载数量 */
  loaded: number;
  /** 总数量 */
  total: number;
  /** 进度百分比 */
  percent: number;
  /** 是否完成 */
  completed: boolean;
}

/**
 * 地图类型枚举
 */
export enum MapType {
  /** 高德地图 */
  GAODE = 'gaode',
  /** 百度地图 */
  BAIDU = 'baidu',
  /** 腾讯地图 */
  TENCENT = 'tencent',
  /** OpenStreetMap */
  OSM = 'osm',
  /** 天地图 */
  TIANDITU = 'tianditu',
  /** 自定义 */
  CUSTOM = 'custom'
}

/**
 * 数据适配器配置
 */
export interface DataAdapterOptions {
  /** 数据源类型 */
  type: DataSourceType;
  /** 经度字段名（CSV类型使用） */
  lngField?: string;
  /** 纬度字段名（CSV类型使用） */
  latField?: string;
  /** 地址字段名（CSV类型使用） */
  addressField?: string;
  /** Geocoding API配置 */
  geocodingConfig?: {
    /** API密钥 */
    apiKey?: string;
    /** 最大并发请求数 */
    maxConcurrent?: number;
  };
}

/**
 * 批量导入配置
 */
export interface BatchImportOptions {
  /** 批量大小 */
  batchSize?: number;
  /** 并发数 */
  concurrency?: number;
  /** 是否启用进度反馈 */
  enableProgress?: boolean;
  /** 失败重试次数 */
  retryCount?: number;
}

/**
 * WebGL 渲染配置
 */
export interface WebGLConfig {
  /** 是否启用颜色映射 */
  colorMap?: boolean;
  /** 颜色映射字段 */
  colorField?: string;
  /** 颜色范围 */
  colorRange?: [string, string];
  /** 点大小 */
  pointRadius?: number;
  /** 是否启用动画 */
  animated?: boolean;
}

/**
 * 矢量瓦片配置
 */
export interface VectorTileOptions extends BaseLayerOptions {
  /** 瓦片URL */
  url?: string;
  /** 瓦片网格大小 */
  tileGrid?: {
    extent?: [number, number, number, number];
    resolutions?: number[];
    tileSize?: number;
  };
  /** 图层样式 */
  layerStyles?: {
    [layerName: string]: any;
  };
}

/**
 * 地图配置选项
 */
export interface MapOptions {
  /** 容器ID或元素 */
  target: string | HTMLElement;
  /** 中心点坐标 [经度, 纬度] */
  center?: [number, number];
  /** 缩放级别 */
  zoom?: number;
  /** 最小缩放级别 */
  minZoom?: number;
  /** 最大缩放级别 */
  maxZoom?: number;
  /** 地图类型 */
  mapType?: MapType;
  /** 自定义瓦片地址（当mapType为CUSTOM时使用） */
  tileUrl?: string;
  /** 是否显示控件 */
  controls?: boolean;
  /** 是否显示缩放控件 */
  zoomControl?: boolean;
  /** 是否显示比例尺 */
  scaleLine?: boolean;
  /** 是否显示鼠标位置 */
  mousePosition?: boolean;
  /** 投影坐标系，默认EPSG:3857 */
  projection?: string;
  /** 数据适配器配置 */
  dataAdapterConfig?: DataAdapterOptions;
}

/**
 * 图层基础配置
 */
export interface BaseLayerOptions {
  /** 图层ID */
  id?: string;
  /** 是否可见 */
  visible?: boolean;
  /** 图层层级（z-index） */
  zIndex?: number;
  /** 透明度 0-1 */
  opacity?: number;
  /** 最小缩放级别 */
  minZoom?: number;
  /** 最大缩放级别 */
  maxZoom?: number;
  /** 图层名称 */
  name?: string;
  /** 图层分组 */
  group?: string;
  /** 权限配置 */
  permissions?: {
    /** 是否可见 */
    visible: boolean;
    /** 是否可编辑 */
    editable: boolean;
  };
  /** 数据加载回调 */
  onDataLoaded?: (features: Feature[]) => void;
  /** 高性能配置 */
  visibilityRange?: {
    minZoom: number;
    maxZoom: number;
  };
  useWebGL?: boolean;
  webGLConfig?: WebGLConfig;
}

/**
 * 聚合图层配置
 */
export interface ClusterLayerOptions extends BaseLayerOptions {
  /** 聚合距离（像素） */
  distance?: number;
  /** 聚合点样式函数 */
  clusterStyle?: (feature: Feature, count: number) => any;
  /** 非聚合点样式 */
  pointStyle?: any;
  /** 是否显示聚合数量 */
  showCount?: boolean;
  /** 聚合数量文本样式 */
  textStyle?: any;
}

/**
 * 轨迹图层配置
 */
export interface TrackLayerOptions extends BaseLayerOptions {
  /** 轨迹线样式 */
  lineStyle?: any;
  /** 起点样式 */
  startPointStyle?: any;
  /** 终点样式 */
  endPointStyle?: any;
  /** 关键点样式 */
  keyPointStyle?: any;
  /** 是否显示关键点 */
  showKeyPoints?: boolean;
  /** 动画播放速度（毫秒/点） */
  animationSpeed?: number;
  /** 是否自动播放 */
  autoPlay?: boolean;
}

/**
 * 热力图图层配置
 */
export interface HeatmapLayerOptions extends BaseLayerOptions {
  /** 热力半径（像素） */
  radius?: number;
  /** 模糊度 */
  blur?: number;
  /** 透明度 */
  gradient?: string[];
  /** 权重字段名 */
  weightField?: string;
  /** 是否自适应缩放 */
  adaptiveRadius?: boolean;
}

/**
 * 事件回调函数类型
 */
export type EventCallback = (event: any, ...args: any[]) => void;

/**
 * 坐标点类型 [经度, 纬度]
 */
export type Coordinate = [number, number];

/**
 * 要素数据接口
 */
export interface FeatureData {
  /** 要素ID */
  id?: string | number;
  /** 坐标点 */
  geometry: Coordinate | Coordinate[];
  /** 属性数据 */
  properties?: Record<string, any>;
}

/**
 * 轨迹点数据接口
 */
export interface TrackPoint {
  /** 坐标 */
  coordinate: Coordinate;
  /** 时间戳 */
  time?: number;
  /** 属性数据 */
  properties?: Record<string, any>;
}

/**
 * 瓦片图层配置
 */
export interface TileLayerOptions extends BaseLayerOptions {
  /** 瓦片URL模板 */
  url?: string;
  /** 瓦片URL模板数组（支持多个子域名） */
  urls?: string[];
  /** 瓦片大小，默认256 */
  tileSize?: number;
  /** 最大缩放级别 */
  maxZoom?: number;
  /** 最小缩放级别 */
  minZoom?: number;
  /** 投影坐标系 */
  projection?: string;
  /** 瓦片加载错误时的重试次数 */
  tileLoadErrorRetryCount?: number;
  /** 跨域设置 */
  crossOrigin?: string | null;
}

/**
 * 标注图层配置
 */
export interface LabelLayerOptions extends BaseLayerOptions {
  /** 标注文本字段名 */
  textField?: string;
  /** 标注样式 */
  labelStyle?: any;
  /** 是否显示标注 */
  showLabel?: boolean;
  /** 标注偏移量 [x, y] */
  offset?: [number, number];
  /** 标注位置 */
  textAlign?: 'left' | 'center' | 'right';
  /** 标注基线 */
  textBaseline?: 'bottom' | 'middle' | 'top';
}

/**
 * 绘制图层配置
 */
export interface DrawLayerOptions extends BaseLayerOptions {
  /** 绘制类型：point, line, polygon, circle等 */
  drawType?: 'Point' | 'LineString' | 'Polygon' | 'Circle';
  /** 是否允许编辑 */
  editable?: boolean;
  /** 是否允许删除 */
  deletable?: boolean;
  /** 绘制完成回调 */
  onDrawEnd?: (feature: Feature<Geometry>) => void;
}

/**
 * 矢量图层配置
 */
export interface VectorLayerOptions extends BaseLayerOptions {
  /** 默认点样式 */
  defaultPointStyle?: any;
  /** 默认线样式 */
  defaultLineStyle?: any;
  /** 默认面样式 */
  defaultPolygonStyle?: any;
  /** 样式函数 */
  styleFunction?: (feature: Feature<Geometry>) => any;
}

/**
 * 图片图层配置
 */
export interface ImageLayerOptions extends BaseLayerOptions {
  /** 图片URL */
  url: string;
  /** 图片范围 [minX, minY, maxX, maxY] */
  extent: [number, number, number, number];
  /** 图片投影坐标系 */
  projection?: string;
}

/**
 * 动画配置
 */
export interface AnimationOptions {
  /** 动画时长（毫秒） */
  duration?: number;
  /** 缓动函数 */
  easing?: (t: number) => number;
  /** 动画完成回调 */
  onComplete?: () => void;
}

